package com.kinyx.framework.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.kinyx.framework.Configs;
import com.kinyx.framework.annotation.assist.CanNotNull;
import com.kinyx.framework.annotation.assist.CanNull;
import com.kinyx.framework.annotation.assist.ReturnNotNull;
import com.kinyx.framework.exception.KRuntimeException;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;

/**
 * 日期时间工具类
 */
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class KDateTimeUtils {

	// ===================================================== toString ===================================================== //
	/**
	 * 转换为日期时间字符串
	 * @param milliseconds  1970-01-01T00:00:00Z开始的时间戳
	 * @param pattern 日期格式模板
	 * @return 日期时间字符串
	 */
	@ReturnNotNull
	public static String toString(@CanNotNull final long milliseconds, @CanNull(defaultValue = "Configs.default_KDateTimeUtils_timePattern") final String pattern) {
		if (pattern == null) { return toString(milliseconds, Configs.default_KDateTimeUtils_timePattern); }
		return new SimpleDateFormat(pattern).format(milliseconds);
	}

	/**
	 * 转换为日期时间字符串
	 * @param date 日期对象
	 * @param pattern 日期格式模板
	 * @return 日期时间字符串
	 */
	@ReturnNotNull
	public static String toString(@CanNotNull final Date date, @CanNull(defaultValue = "Configs.default_KDateTimeUtils_timePattern") final String pattern) {
		return toString(date.getTime(), pattern);
	}

	// ===================================================== now ===================================================== //
	/**
	 * 取当前日期时间字符串
	 * @param pattern 日期格式模板
	 * @return 日期时间字符串
	 */
	@ReturnNotNull
	public static String now(@CanNull(defaultValue = "Configs.default_KDateTimeUtils_timePattern") final String pattern) {
		return toString(new Date(), pattern);
	}

	// ===================================================== toDate ===================================================== //
	/**
	 * 转换为Date
	 * @param str 日期时间字符串
	 * @param pattern 日期格式模板
	 * @return Date
	 */
	@ReturnNotNull
	public static Date toDate(@CanNotNull final String str, @CanNull(defaultValue = "Configs.default_KDateTimeUtils_timePattern") final String pattern) {
		if (pattern == null) { return toDate(str, Configs.default_KDateTimeUtils_timePattern); }
		try {
			return new SimpleDateFormat(pattern).parse(str);
		} catch (final ParseException e) {
			throw new KRuntimeException(e);
		}
	}

	/**
	 * 转换为Date
	 * @param milliseconds  1970-01-01T00:00:00Z开始的时间戳
	 * @return Date
	 */
	@ReturnNotNull
	public static Date toDate(@CanNotNull final long milliseconds) {
		return new Date(milliseconds);
	}

	// ===================================================== format ===================================================== //
	/**
	 * 格式化日期时间字符串
	 * @param str 日期时间字符串
	 * @param fromPattern 日期格式模板（源）
	 * @param toPattern 日期格式模板（目标）
	 * @return 日期时间字符串
	 */
	@ReturnNotNull
	public static String format(@CanNotNull final String str, @CanNull(defaultValue = "Configs.default_KDateTimeUtils_timePattern") final String fromPattern, @CanNull(defaultValue = "Configs.default_KDateTimeUtils_timePattern") final String toPattern) {
		return toString(toDate(str, fromPattern).getTime(), toPattern);
	}

}
